package TF;

import java.util.HashMap;
import java.util.ArrayList;

public class yan{
	private static final double TAX_RATE_ZERO = 0;  //定义全局变量，值为税率
	private static final double TAX_RATE_ONE = 0.03;
	private static final double TAX_RATE_TWO = 0.1;
	private static final double TAX_RATE_THREE = 0.2;
	private static final double TAX_RATE_FOUR = 0.25;
	private static final double TAX_RATE_FIVE = 0.3;
	private static final double TAX_RATE_SIX = 0.35;
	private static final double TAX_RATE_SEVEN = 0.45;
	private int[] week = new int[5];	//周数
	ArrayList<lab> labArray = new ArrayList<lab>(); //用来存放lab对象的容器，目的是可以遍历每个lab对象
	ArrayList<student> stuArray = new ArrayList<student>();//用来存放student对象的容器，以遍历每个student对象
	private student currentStudent;  //student的对象，表示当前使用的student对象；
	
	public void addLabStudent() { //这个函数的作用是：我只需在这个函数里增加相应的student和lab，以及建立他们之间的关系即可；
		lab labone,labtwo,labthree,labfour,labfive,labsix;
		labone = new lab("000");   //创建一个实验室，并命名
		addLab(labone);				//将该实验室放入labArray容器中；
		labtwo = new lab("001");
		addLab(labtwo);
		labthree = new lab("003");
		addLab(labthree);
		labfour = new lab("004");
		addLab(labfour);
		labfive = new lab("005");
		addLab(labfive);
		labsix = new lab("006");
		addLab(labsix);
		
		student tfyan,lijj,xiaoming; 
		tfyan = new student("tfyan"); //有一个学生的名字为tfyan;
		addStu(tfyan);				//将该学生放入stuArray容器中；
		lijj = new student("lijj");
		addStu(lijj);
		xiaoming = new student("小明");
		addStu(xiaoming);
		labone.setManage(labone,tfyan);//tfyan这名学生负责管理labone名为000的实验室；
		labtwo.setManage(labtwo,lijj);
		labthree.setManage(labthree,lijj);
		labfour.setManage(labfour,tfyan);
		labfive.setManage(labfive,tfyan);
		labsix.setManage(labsix, xiaoming);
	}
	public void addLab(lab l) { //作用是向labArray容器中增加实验室lab对象
		labArray.add(l);
	}
	public void addStu(student stu) { //向stuArray容器中增加学生student对象
		stuArray.add(stu);
	}
	public void getLbaBeCleanLevel() {    //作用是得到实验室被打扫的卫生水平；
		for(lab b:labArray) {
			b.getNotes().add("实验室名称：");	/*getNotes()是lab类的函数，返回一个名为notes的容器，
			                              用来存放实验室被打扫的记录 */
			b.getNotes().add(b.getName());  //开始先放入该实验室的名字；
		}
		 for(int wk=1;wk<=week.length;wk++) {  //循环次数为周数；
			 for(lab l:labArray) {   //得到每个lab（实验室）对象赋给l;
				 String s=""+wk;		//将周数传为字符串，传入BeCleaned()函数中；
				 l.BeCleaned(s);		//BeCleaned()的作用是记录一周内实验室被学生打扫的时间和卫生得分；
					 }				
		}
	}
	public void getStudentGrade() { //得到学生每周的打扫评分；
		for(lab l:labArray) {	//遍历lab对象
			currentStudent = l.backStudent(l); //每一个lab都与相应的student有HashMap关系，
			 currentStudent.g(l);			//backStudent()在lab类中用来返回lab对应的student对象；
		}
	}
	public void getWage() {		//得到学生的工资；
		for(student s:stuArray) {	
			for(int i=0;i<s.getGrade().size();i++) {	//grade是一个student的容器；用来存放每周检查后得到的评分；
				if(s.getGrade().get(i).equals("A")) s.getMoney(1500); //评分为四个等级，用相应的补助；
				if(s.getGrade().get(i).equals("B")) s.getMoney(1200);
				if(s.getGrade().get(i).equals("C")) s.getMoney(800);
				if(s.getGrade().get(i).equals("D")) s.getMoney(600);
			}
			double wage = s.getWage();	//getWage()可返回工资；
			if(wage<=5000) s.getPostTaxWage(wage-wage*TAX_RATE_ZERO); //得到总的工资后在计算税后的实际工资；
			if(wage>5000 && wage<=8000) s.getPostTaxWage(wage-wage*TAX_RATE_ONE);
			if(wage>8000 && wage<=17000) s.getPostTaxWage(wage- wage*TAX_RATE_TWO);
			if(wage>17000 && wage<=30000) s.getPostTaxWage(wage-wage*TAX_RATE_THREE);
			if(wage>30000 && wage<=40000) s.getPostTaxWage(wage-wage*TAX_RATE_FOUR);
			if(wage>40000 && wage<=60000) s.getPostTaxWage(wage-wage*TAX_RATE_FIVE);
			if(wage>60000 && wage<=85000) s.getPostTaxWage(wage-wage*TAX_RATE_SIX);
			if(wage>85000) s.getPostTaxWage(wage-wage*TAX_RATE_SEVEN);
		}
	}
	public void printTotalWage() { //输出税前工资
		System.out.println("税前总工资：");
		for(student s:stuArray) {
			System.out.println(s.getName()+":"+s.getWage()+"（元）");
		}
	}
	public void printPostTaxwage() { //输出税后工资
		System.out.println("\n税后总工资：");
		for(student s:stuArray) {
			System.out.println(s.getName()+":"+s.backPostTaxWage()+"（元）");
		}
	}
	public void print() { 		//输出学生对管理的实验室的打扫记录
		System.out.println("\n**************************");
		System.out.println("打扫记录：");
		for(student s:stuArray) {
			System.out.println("姓名："+s.getName());
			System.out.println("周次"+"\t"+"周几");
			for(int i=0;i<s.getRecord().size();i+=2) {
				String week = s.getRecord().get(i);    //record是一个用来存放周数的星期几的容器，里面的值使从容器
				String day = s.getRecord().get(i+1);	//notes里得到的(过滤notes里的打扫等级);
				System.out.println(week+"\t"+day);
			}
		}
	}
	public static void main(String[] args) { //按照先后顺序执行函数；
		yan test = new yan();
		test.addLabStudent();
		test.getLbaBeCleanLevel();
		test.getStudentGrade();
		test.getWage();
		test.printTotalWage();
		test.printPostTaxwage();
		test.print();
	}
}

class student{	//学生类
	private ArrayList<String> grade = new ArrayList<String>(); //存放学生每周的打扫评分；
	private ArrayList<String> record = new ArrayList<String>();//存放对实验的打扫记录；
	private String name;	//学生名字
	private double wage;	//税前工资
	private double postTaxWage; //税后工资；
	
	
	public student(String name) { //构造函数，在new student时赋一个名字；
		this.name = name;
	}
	public ArrayList<String> getGrade() {  //在其他类用student对象可得到该对象的grade；
		return grade;
	}
	public ArrayList<String> getRecord() {	//在其他类中用student对象可得到该对象的record；
		return record;
	}
	public String getName() {	//在其他类用student对象调用可得到该对象的name;
		return name;
	}
	public double getWage() { //在其他类用student对象调用可得到该对象的wage;
		return wage;
	}
	public void getMoney(double cash) { //使wage增加
		wage +=cash;
	}
	public double backPostTaxWage() { //在其他类用student对象调用可得到该对象的postTaxWage;
		return postTaxWage;
	}
	public void getPostTaxWage(double money) { //得到税后的钱；
		postTaxWage = money;
	}
	public void g(lab b) {   //检查记录评分和记录打扫记录；
		String gradedLevel;
		for(int i=0;i<b.getNotes().size();i++) { 
			String element = b.getNotes().get(i);
			if(element=="@" && i!=0) {    //@是用来记录notes容器中要检查的那一天；
				gradedLevel = b.getNotes().get(i-1); //记录里检查打扫最近一天的卫生作为得分；
				if(gradedLevel!="@") grade.add(gradedLevel);
			}
			if(element!="@" && !(element.equals("A") || element.equals("B") || element.equals("C")
					|| element.equals("D"))){
				record.add(element); //把打扫的周数和星期几放入record中；
			}
		}
	}
}

class lab {		//实验室类
	private String name;	//实验室名称
	private char level;		//被打扫评分；
	private HashMap<lab,student> manage = new HashMap<lab,student>(); //Hash表,把自己和学生联系起来；
	private ArrayList<String> notes = new ArrayList<String>(); //用来存放打扫记录和评分和检查标记的容器；
	public lab(String name) {  //初始化实验室名称；
		this.name = name;
	}
	public String getName() {	//返回name;
		return name;
	}
	public ArrayList<String> getNotes () {	//返回notes
		return notes;
	}
	public void setManage(lab l,student stu) {	//设置lab对象和student对象的对应关系
		manage.put(l,stu);
	}
	public student backStudent(lab l) {		//返回lab对象在HashMap表中对应的student对象
		return manage.get(l);
	}
	
	public void BeCleaned(String week) {  //记录被自己打扫的情况
		boolean decide = true;  //用来判断是否检查
			for(int j=1;j<=7;j++) { 	//一周七天
					int num = (int)(Math.random()*2); //产出随机数0或1，用来执行学生是否打扫；
					if(num==1) {    //if是1，打扫
						level = (char)(65+Math.random()*4); //随机产生打扫的卫生水平A,B,C,D;
						String s1=""+j;     //将星期几转换为字符串
						String s2=""+level; //将卫生评分转换为字符串
						notes.add(week);   //将周数放入notes中
						notes.add(s1);		//星期几放入notes中
						notes.add(s2);		//卫生评分放入notes中；
					}
				if((j==5 || j==6 || j==7) && num==1 && decide) { //在周五到周日随机检查
					notes.add("@");   //把要检查的那一天用@记录
					decide = false;		//一周只检查一天
				}
			}
			if(decide) notes.add("@"); //如果周五，周六没有检查，默认周日检查；
	}
}
